京东统一头尾管理系统探索实践
Tech导读
统一头尾管理系统致力于解决快速更新京东全站文案和图片的问题,大大提升研发效率,降低网站的维护成本,使得研发人员可以一键切换全站头尾内容。
导读
统一头尾管理系统致力于解决快速更新京东全站文案和图片的问题,大大提升研发效率,降低网站的维护成本,使得研发人员可以一键切换全站头尾内容。01 系统背景
在今年的敏捷团队建设中,我通过Suite执行器实现了一键自动化单元测试。Juint除了Suite执行器还有哪些执行器呢?由此我的Runner探索之旅开始了!
图1.
比如上图,是目前京东网站统一在使用的页面尾部,如果想要修改尾部的文案或者链接,那就需要去推动上百个系统和研发团队去排期修改并上线。为了解决这一问题,京东统一头尾管理系统就这样诞生了,基本上实现了五分钟修改京东全站公共头尾内容。目前,统一头尾系统取得的成果如下:
02
系统总体架构设计
理解,首先 MCube 会依据模板缓存状态判断是否需要网络获取最新模板,当获取到模板后进行模板加载,加载阶段会将产物转换为视图树的结构,转换完成后将通过表达式引擎解析表达式并取得正确的值,通过事件解析引擎解析用户自定义事件并完成事件的绑定,完成解析赋值以及事件绑定后进行视图的渲染,最终将目标页面展示到屏幕。
整个系统主要包括两部分,第一部分是管理后台,主要用来管理京东的公共头尾文件和业务系统,配置业务系统与公共头尾文件的关联关系,并针对业务系统进行公共头尾文件的分发。第二部分是头尾客户端,主要用来获取业务系统依赖使用的头尾文件,然后解析渲染页面,将最新版本的头尾文件内容进行输出。而为了应对不同版本语言开发的业务系统,头尾客户端又分成Java客户端和Nginx客户端。Java客户端主要支持Java语言开发的业务系统,不仅可以解析处理静态HTML,还支持解析JSP/Velocity/FreeMarker/Thymeleaf等页面模板引擎。Nginx客户端则支持了非Java语言开发的业务系统,实现了非Java系统的页面模板解析和渲染公共头尾的功能。
03
管理后台设计与实现
理解,首先 MCube 会依据模板缓存状态判断是否需要网络获取最新模板,当获取到模板后进行模板加载,加载阶段会将产物转换为视图树的结构,转换完成后将通过表达式引擎解析表达式并取得正确的值,通过事件解析引擎解析用户自定义事件并完成事件的绑定,完成解析赋值以及事件绑定后进行视图的渲染,最终将目标页面展示到屏幕。
文件管理模块
应用管理模块
个人中心模块
用来记录管理后台用户的各种操作日志,包括文件操作和应用操作,并提供操作日志查询功能。还针对公共头尾文件的发布操作进行上线审批处理。
04 头尾客户端设计与实现
理解,首先 MCube 会依据模板缓存状态判断是否需要网络获取最新模板,当获取到模板后进行模板加载,加载阶段会将产物转换为视图树的结构,转换完成后将通过表达式引擎解析表达式并取得正确的值,通过事件解析引擎解析用户自定义事件并完成事件的绑定,完成解析赋值以及事件绑定后进行视图的渲染,最终将目
头尾系统Push方式:
业务系统Pull方式:
Nginx头尾客户端
该方式主要是利用了Nginx的SSI模块来实现头尾文件的拉取和SSI问题,ngx_http_ssi_module模块是Nginx中的一个过滤器,在经过它的响应中处理SSI(服务端包含)指令。目前用到的就是inclued指令,配置示例:
<!--# include file="/fragment/footer.html" -->
location ~ ^/fragment/ {
proxy_cache header_cache;
proxy_cache_key $uri;
proxy_cache_valid 200 1m;
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
proxy_cache_lock on;
proxy_cache_lock_timeout 1s;
proxy_connect_timeout 1s;
proxy_ignore_headers Set-Cookie Cache-Control;
proxy_hide_header Cache-Control;
proxy_hide_header Set-Cookie;
# 参考头尾系统中配置,请注意区分测试环境和生产环境,返回的文件内容默认都是UTF-8编码内容,如果需要GBK编码内容需要在env后面拼接参数?charset=GBK
# 只需要替换{appId} {token} 和 {env}
rewrite ^/fragment/(.*) /open/fragment/$1/Nginx/$nginx_version/$server_addr/{appId}/{token}/{env} break;
proxy_set_header Accept-Encoding "";
add_header X-Cache-Status $upstream_cache_status;
proxy_pass http://xxx.jd.local;
}
Java头尾客户端
前边介绍的Nginx方式客户端虽然已经解决了头尾文件的SSI问题,但由于Nginx的SSI过程是在用户访问页面时才触发的,属于用户请求过程中的同步调用,即使增加了本地缓存,但还是会对页面的响应时间有所影响。所以为了解决这一性能损耗问题,专门开发了一个Java版本的头尾客户端,来实现头尾文件的SSI功能。头尾客户端的启动过程如下图:
9. 模板解析完成后注册启动一个头尾文件观察者,专门用来监视头尾文件是否更新,如果有更新,再次解析内存中的模板内容生成新的模板文件。
05 总结
理解,首先 MCube 会依据模板缓存状态判断是否需要网络获取最新模板,当获取到模板后进行模板加载,加载阶段会将产物转换为视图树的结构,转换完成后将通过表达式引擎解析表达式并取得正确的值,通过事件解析引擎解析用户自定义事件并完成事件的绑定,完成解析赋值以及事件绑定后进行视图的渲染,最终将
一文帮你搞定H5、小程序、Taro长列表曝光埋点
一种新的告警收敛方式“先知预警”,为您的系统健康护航
到底该如何搭建一个新系统
求分享
求点赞
求在看